var fs = require('fs');
var config = require('./index');
var _ = require('lodash');
var util = require('util');
var path = require('path');
var swig = require('swig');
var moment = require('moment');
var crypto = require('crypto');

// 东八区
swig.setDefaultTZOffset(-480);

// 配置模板加载路径
swig.setDefaults({
  loader: swig.loaders.fs(path.dirname(__dirname)),
  cache: config.templateCache // disabled for dev, should be commented on product
});

// 根据路径计算文件实际存储位置
function calpath(input) {
  if (/^\/static\//.test(input)) {
    return path.join(config.static, String(input).replace('/static/', ''));
  }
  return path.join(config.assets, String(input).replace('/assets/', ''));
}

// 添加静态版本控制
var versions = {};
swig.setFilter('version', function (input) {
  if (!versions[input]) {
    var file = calpath(input);
    try {
      var text = fs.readFileSync(file).toString();
      var version = crypto.createHash('md5').update(text).digest('hex').substring(0, 8).toUpperCase();
      var extname = path.extname(file);
      // 需要配合静态路径重写路由
      versions[input] = util.format('%s/%s-$%s$%s', path.dirname(input), path.basename(input, extname), version, extname);
    }
    catch (e) {
      var extname = path.extname(input);
      versions[input] = util.format('%s?$%s$%s', input, Date.now(), extname);
    }
  }

  return versions[input];
});

// 移除后台录入的style标签
swig.setFilter('rmstyle', function (content) {
  return content.replace(/\s?style=".+?"/g, '');
});

// 移除HTML标签
swig.setFilter('rmhtml', function (content) {
  var regex = /(<([^>]+)>)/ig;
  return content.replace(regex, '');
});

// 添加千丁券过滤器
swig.setFilter('coupon', function (input) {
  // 1:未使用 2,已使用 3：已过期 4：已作废 5：未生效 6：已锁定
  return [null, '未使用', '已使用', '已过期', '已作废', '未生效', '已锁定'][Number(input)] || '已禁用';
});

// 订单状态
swig.setFilter('order', function (input) {
  // 1:已下单待付款 2:已退单 3:过期已取消 4:已付全款 5:全部签收 6:付款中 7:支付失败
  return [null, '待付款', '已退单', '已过期', '已付款', '已签收', '付款中', '支付失败', null, '部分到货', '全部到货', '部分签收', null, '部分退款', '全部退款', '现金部分退款', '现金全部退款'][Number(input)] || '已禁用';
});

// 包含
swig.setFilter('contains', function (list, item) {
  return list.indexOf(item) !== -1;
});

// 被包含
swig.setFilter('contained', function (input, list) {
  return list.indexOf(input) !== -1;
});

// 迭代数组
swig.setFilter('range', function (input, end) {
  var array = [];
  array.length = end ? end - input : input;
  return array;
});

// 添加性别过滤器
swig.setFilter('sex', function (input) {
  return ['女士', '先生'][input] || '保密';
});

// 添加支付方式过滤器
swig.setFilter('payType', function (input) {
  return {
    '11': '现金支付',
    '21': '刷卡支付',
    '31': '支付宝',
    '41': '微信支付',
    '51': '微信APP',
    '61': '钱包支付',
    '71': '洗车次卡',
    '91': '混合支付'
  }[input] || '其他方式';
});

// 通知类型
swig.setFilter('notice', function (input) {
  return [null, '紧急通知', '通知', '社区活动', '图文', '链接', '温馨提示'][Number(input)] || '';
});

// 添加小数点
swig.setFilter('currency', function (input, size, symbol) {
  return _.isUndefined(input) ? '' : (_.isUndefined(symbol) ? '￥' : symbol) + Number(input).toFixed(_.isUndefined(size) ? 2 : size);
});

// 设置class
swig.setFilter('clazz', function (input, name) {
  return input ? name : '';
});

// 截取字符串
swig.setFilter('substring', function (input, i, j) {
  return String(input).substring(i, j);
});

// 时间段
swig.setFilter('duration', function (input) {
  var times = input.split(',');
  var x = new Date(times[0] * 1000);
  var y = new Date(times[1] * 1000);
  var m = x.getMonth() + 1;
  var d = x.getDate();
  var t1 = moment(x).format('HH:mm');
  var t2 = moment(y).format('HH:mm');
  return util.format('%d月%d日 %s-%s', m, d, t1, t2);
});

// 默认头像
swig.setFilter('figure', function (head) {
  return head || 'http://7xjyap.com2.z0.glb.qiniucdn.com/image-cc56fe83-68a4-46a7-9c88-9e74f6a4af77.png';
});

// 转换数字
swig.setFilter('number', function (input) {
  return Number(input);
});

// 保留小数
swig.setFilter('toFixed', function (input, count) {
  return Number(input).toFixed(count);
});

// 替换为空白图片
swig.setFilter('holder', function (input) {
  return input || '/assets/images/opacity.png';
});

// 截取字符串
swig.setFilter('truncate', function (input, size) {
  input = String(input || '');
  if (input.length <= size) {
    return input;
  }
  return input.substring(0, size) + '...';
});

// 通用业态的价格
swig.setFilter('bsprice', function (input) {
  var type = Number(input.priceType);
  if (type === 0) {
    return this.currency(input.price / 100);
  }
  else {
    var list = input.priceRange.split(',');
    return this.currency(list[0] / 100, 0) + ' - ' + this.currency(list[1] / 100, 0);
  }
});

// 通用业态的底价
swig.setFilter('bslower', function (input) {
  try {
    var type = Number(input.priceType);
    if (type === 0) {
      return this.currency(input.price / 100);
    }
    else {
      var list = input.priceRange.split(',');
      return this.currency(list[0] / 100) + '起';
    }
  }
  catch (e) {
    return this.currency(0);
  }

});

// 通用业态模板类型
swig.setFilter('bstemplate', function (input) {
  var types = [null, 'A', 'B', 'C'];
  return types[input] || 'B';
});

// 三元表达式
swig.setFilter('choose', function (input, a, b) {
  return input ? a : b;
});

// 七牛缩略图服务
swig.setFilter('thumb', function (uri, width, height) {
  uri = uri || '/assets/images/opacity.png';
  if (uri.indexOf('?') === -1) {
    uri = uri + '?imageView2/2/w/' + width + '/h/' + height;
  }
  return uri;
});

// 截取
swig.setFilter('limitTo', function (list, count, index) {
  // 使用slice 替换splice 以防更改原始列表
  index = index || 0;
  return (list || []).slice(index, count + index);
});

// 公告类型
swig.setFilter('noticeTag', function (type, list) {
  var data = _.find(list, {
    noticeType: type
  }) || {
    noticeColor: '927ae9',
    noticeName: '公告',
  };
  return '<span class="tag" style="background-color:#' + data.noticeColor + '">' + data.noticeName + '</span>'
});

// 跳转模型
swig.setFilter('skipModel', function (model) {
  // 转换JSON
  if (typeof model === 'string') {
    try {
      model = JSON.parse(model);
    }
    catch (e) {
      return 'javascript:;';
    }
  }
  var data = model.entity;
  switch (data.skno) {
  case 1000:
    return '/home';
  case 1001:
    return '/home';
  case 1002:
    return '/assistant/notices';
  case 2000:
    return '/assistant';
  case 4000:
    return '/profile';
  case 4001:
    return '/account/orders';
  case 4002:
    return '/account/addresses';
  case 4003:
    return '/shopping/cart';
  case 4008:
    return '/shopping/order/' + data.id;
  case 4009:
    return '/shopping/order/' + data.id;
  case 4100:
    return '/wallet';
  case 4101:
    return '/wallet/records';
  case 4102:
    return '/wallet/deposit';
  case 4104:
    return '/account/coupons';
  case 4105:
    return '/wallet/manage';
  case 4200:
    return '/settings';
  case 4204:
    return '/account/mobile';
  case 5000:
    return '';
  case 5001:
    return '';
  case 5002:
    return '';
  case 5003:
    return '';
  case 5004:
    return '/shopping/details/' + data.id;
  case 5005:
    return '/shopping/feature/' + data.id;
  case 5006:
    return '/shopping';
  case 7000:
    return data.url;
  }
  return '#install';
});